package com.kuaiyin.utils;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;

/**
 * 分页结果封装（不可变设计）
 */
public record PageResult<T>(
        List<T> records,   // 当前页数据（不可变列表）
        long total,        // 总记录数
        int pageNum,       // 当前页码（从1开始）
        int pageSize,      // 每页条数
        int pages,         // 总页数
        boolean hasNext    // 是否有下一页
) {
    // 静态工厂方法（自动计算总页数和hasNext）
    public static <T> PageResult<T> of(List<T> records, long total, int pageNum, int pageSize) {
        int pages = calculatePages(total, pageSize);
        boolean hasNext = pageNum < pages;

        return new PageResult<T>(
                Collections.unmodifiableList(records),
                total,
                pageNum,
                pageSize,
                pages,
                hasNext
        );
    }

    // 计算总页数（至少1页）
    private static int calculatePages(long total, int pageSize) {
        if (total == 0) return 1;
        return (int) Math.ceil((double) total / pageSize);
    }

    // 数据转换（返回新实例，保持分页信息）
    public <R> PageResult<R> map(Function<T, R> mapper) {
        List<R> newRecords = records.stream()
                .map(mapper)
                .toList();

        return new PageResult<>(
                newRecords,
                total,
                pageNum,
                pageSize,
                pages,
                hasNext
        );
    }
}